/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tpdisenio2009.mvp.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import tpdisenio2009.Constants;
import tpdisenio2009.Tpdisenio2009App;
import tpdisenio2009.filters.AFAPlayerFilter;
import tpdisenio2009.model.beans.SoccerPlayer;
import tpdisenio2009.model.beans.User;
import tpdisenio2009.mvp.display.QueryAFAPlayersView;
import tpdisenio2009.services.FantasyTeamPlayerService;
import tpdisenio2009.services.RealTeamService;
import tpdisenio2009.services.SoccerPlayerService;

/**
 *
 * @author Pablito
 */
public class QueryAFAPlayersPresenter extends DefaultPresenter<QueryAFAPlayersView> {

    private final SoccerPlayerService soccerPlayerService;    
    private final FantasyTeamPlayerService fantasyTeamPlayerService;
    private final RealTeamService realTeamService;    

    private SoccerPlayer selectedPlayer;    
   
    private ActionListener searchListener;
    private ActionListener addPlayerListener;
    private ActionListener exitListener;
    //private ItemListener positionChangeListener;

    public QueryAFAPlayersPresenter( QueryAFAPlayersView view ) {

        super( view );

        soccerPlayerService = new SoccerPlayerService();        
        fantasyTeamPlayerService = new FantasyTeamPlayerService();
        realTeamService = new RealTeamService();

        selectedPlayer = null;

        if ( Tpdisenio2009App.loggedUser instanceof User) {
            
            if ( getView().getWindowPosition() == null ) {
                getView().setClubs( realTeamService.getRealTeams() );
                getView().setPosition( getPositions() );
                //Integer gastado = fantasyTeamService.getLlevasGastado( user.getFantasyTeam() );
                //getView().setLlevasGastado( gastado );
                getView().setLlevasGastado( Constants.TOTAL_MONEY - getView().getBudget() );
                getView().setTeQuedan( getView().getBudget() );
                getView().setMinCotization( Constants.MIN_PRICE );
                getView().setMaxCotization( Constants.MAX_PRICE );
                getView().loadSoccerPlayers( soccerPlayerService.getAllSoccerPlayers( ));                
                
                bind();
            } else {
                getView().setClubs( realTeamService.getRealTeams() );
                getView().setPosition( getPositions() );
                getView().setSelectedPosition( getView().getWindowPosition() );
                getView().disablePosition();
                //Integer gastado = fantasyTeamService.getLlevasGastado( user.getFantasyTeam() );
                //getView().setLlevasGastado( gastado );
                getView().setLlevasGastado( Constants.TOTAL_MONEY - getView().getBudget() );
                getView().setTeQuedan( getView().getBudget() );
                getView().setMinCotization( Constants.MIN_PRICE );
                getView().setMaxCotization( Constants.MAX_PRICE );
                getView().loadSoccerPlayers( soccerPlayerService.getSoccerPlayersByPosition( getView().getWindowPosition() ));
        
                bind();
            }
        } else {
            getView().showNotification( "<html> Su usuario es incorrecto. <br>Compruebe que no sea un Administrador o un Periodista.</html>", "Usuario Incorrecto" );
        }

    }

    public SoccerPlayer getSelectedPlayer() {
        return selectedPlayer;
    }

    public void bind() {

        searchListener = new ActionListener() {
            public void actionPerformed( ActionEvent e ) {
                
                if ( validate() ) {
                    AFAPlayerFilter filter = new AFAPlayerFilter();
                    filter.setClub( getView().getClub() );
                    if( getView().getWindowPosition() == null ) {
                        filter.setPosition( getView().getCurrentPosition() );
                    } else {
                        filter.setPosition( getView().getWindowPosition() );
                    }
                    filter.setCotizationRange( getView().getMinCotization(), getView().getMaxCotization() );

                    getView().loadSoccerPlayers( soccerPlayerService.getByFilter( filter ) );
                }
            }
        };
        getView().addSearchPlayerListener( searchListener );

        addPlayerListener = new ActionListener() {
            public void actionPerformed( ActionEvent e ) {
                selectedPlayer = getView().getSelectedPlayer();
                if (validateAddPlayer()) {
                    getView().close();
                } else {
                    selectedPlayer = null;
                }
            }
        };
        getView().addAddPlayerListener(addPlayerListener);

        exitListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                getView().close();
            }
        };
        getView().addExitListener( exitListener );
    }

    public void unbind() {
        if (searchListener != null)
            getView().removeSearchPlayerListener( searchListener );
        if (addPlayerListener != null)
            getView().removeAddPlayerListener( addPlayerListener );
        if (exitListener != null)
            getView().removeExitListener( exitListener );               
    }

    private boolean validate() {
        if ( getView().isMinCotizationEmpty() ) {
            getView().showError( getView().MIN_ERROR,
                    "<html>El campo <strong>Cotización Mínima</strong> es obligatorio,<br>y no puede dejarse en blanco.</html>",
                    "Error:Campo obligatorio incompleto" );
            return false;        
        } else if ( ! validateCotizationTextField( getView().getMinCotizationString() ) ) {
            getView().showError( getView().MIN_ERROR,
                    "<html>El campo <strong>Cotización Mínima</strong> solo debe contener<br>números enteros positivos.</html>",
                    "Error:Entrada inválida" );
            return false;
        } else if ( ! validateCotizationTextField( getView().getMaxCotizationString() ) ) {
            getView().showError( getView().MAX_ERROR,
                    "<html>El campo <strong>Cotización Máxima</strong> solo debe contener<br>números enteros positivos.</html>",
                    "Error:Entrada inválida" );
            return false;
        } else if ( getView().isMaxCotizationEmpty()) {
            getView().showError( getView().MIN_ERROR,
                    "<html>El campo <strong>Cotización Máxima</strong> es obligatorio,<br>y no puede dejarse en blanco.</html>",
                    "Error:Campo obligatorio incompleto" );
            return false;
        } else if ( getView().getMinCotization() > getView().getMaxCotization() ) {
            getView().showError( getView().MIN_ERROR,
                    "<html>El valor del campo <strong>Cotización Mínima</strong> debe ser menor<br>o igual al valor del campo <strong>Cotización Máxima</strong>.</html>",
                    "Error:Rango incorrecto" );
            return false;
        } else {
            return true;
        }
    }

    private boolean validateAddPlayer() {        
        if ( getView().getSelectedPlayer() == null) {
            getView().showError( getView().NOT_SELECTED_PLAYER_ERROR,
                    "<html>No ha seleccionado un jugador,<br>Por favor, seleccione uno antes de agregarlo.</html>",
                    "Error:Jugador no seleccionado" );
            return false;        
        } else if ( fantasyTeamPlayerService.validateGoalkeepers( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().GK_ERROR,
                    "<html>Tu equipo ya posee 2 Arqueros.<br>No puedes agregar otro.</html>",
                    "Error:Arqueros" );
            return false;
        } else if ( fantasyTeamPlayerService.validateDefenders( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().DF_ERROR,
                    "<html>Tu equipo ya posee 5 Defensas.<br>No puedes agregar otro.</html>",
                    "Error:Defensas" );
            return false;        
        } else if ( fantasyTeamPlayerService.validateMidfielers( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().MF_ERROR,
                    "<html>Tu equipo ya posee 4 Volantes.<br>No puedes agregar otro.</html>",
                    "Error:Volantes" );
            return false;        
        } else if ( fantasyTeamPlayerService.validateFordwars( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().FW_ERROR,
                    "<html>Tu equipo ya posee 4 Delanteros.<br>No puedes agregar otro.</html>",
                    "Error:Delanteros" );
            return false;        
        } else if ( fantasyTeamPlayerService.validateSameTeamPlayers( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().THREE_PLAYERS_ERROR,
                    "<html>Tu equipo ya posee 3 jugadores de<br><strong>" + getView().getSelectedPlayer().getRealTeam().getName() +"</strong><br>No puedes agregar otro.</html>",
                    "Error:Jugadores de un mismo equipo" );
            return false;        
        } else if ( fantasyTeamPlayerService.validateSamePlayer( getView().getSoccerPlayers() , getView().getSelectedPlayer() ) ) {
            getView().showError( getView().SAME_PLAYER_ERROR,
                    "<html>Tu equipo ya posee a este jugador.<br>No puedes volver a agregarlo.</html>",
                    "Error:Jugadores de un mismo equipo" );
            return false;
        } else if ( getView().getBudget() < getView().getSelectedPlayer().getPrice() ) {
            getView().showError( getView().COTIZATION_ERROR,
                    "<html>Has superado el límite de presupuesto ($" + Constants.TOTAL_MONEY.toString() +")<br>No puedes agregar este jugador.</html>",
                    "Error:Jugadores de un mismo equipo" );
            return false;
        } else {            
            return true;
        }
    }

    private boolean validateCotizationTextField( String cotization ) {
        return Pattern.matches("[0-9]*", cotization );
    }

    public List<String> getPositions() {
        List<String> positions = new ArrayList<String>();
        positions.add( 0, "Todos" );
        positions.add( 1, getView().GOALKEEPER );
        positions.add( 2, getView().DEFENDER );
        positions.add( 3, getView().MIDFIELDER );
        positions.add( 4, getView().FORWARD );
        return positions;
    }
}
